# 异步协程
import asyncio;
import aiohttp as http;
import time;

# 注意：
#     在异步修饰的方法体内，出现了同步相关操作，会马上停止异步操作，改为同步(也就是在下面的代码中,func函数内不可以出现同步相关操作)
#     request 就是同步操作 => request.get(url)
#     aiohttp 是异步得 => func 函数内



# 该函数执行后会返回一个协程对象
async def func(url):
    print(f"正在下载：{url}对应资源...");
    async with http.ClientSession() as session:
        async with await session.get(url) as response:
            # text() 文本
            # json() json对象
            # read() 二进制

            page_text = await response.text();
            print(page_text);


# 回调函数
def callback_func(task):
    print("回调函数执行了...");
    print(task.result());


# 调用
def request_func(urls = [],callback = None):
    # 任务列表
    tasks = [];
    # 获取loop对象
    loop = asyncio.get_event_loop();
    for url in urls:
        # 获取协程对象
        c = func(url);
        # 注册任务 方式1
        task = loop.create_task(c);

        # 注册任务 方式2
        # task = asyncio.ensure_future(c);

        # 绑定回调函数
        # task.app_done_callback(callback_func());
        # 对任务列表添加数据
        tasks.append(task);

    # 注册并运行一个任务列表
    loop.run_until_complete(asyncio.wait(tasks));


if __name__ == '__main__':

    urls = [
        "www.baidu.com",
        "www.google.com",
        "www.qq.com"
    ];


    start = time.time();
    request_func(urls=urls);
    end = time.time();

    print(int(end - start));
